package util
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.geom.Rectangle;
	import flash.utils.ByteArray;
	import flash.xml.XMLDocument;
	import flash.xml.XMLNode;
	
	import mx.core.UIComponent;
	import mx.formatters.DateFormatter;
	import mx.formatters.NumberFormatter;
	import mx.graphics.codec.JPEGEncoder;
	import mx.messaging.FlexClient;
	import mx.rpc.remoting.RemoteObject;
	import mx.rpc.xml.SimpleXMLDecoder;
	import mx.utils.Base64Decoder;
	import mx.utils.UIDUtil;
	
	import mycomponents.MyXmlEncoder;
	
	import util.Constants;

	public class GDUtil
	{
		/**
		 * 得到全局唯一ID
		 *  
		 */
		public static function getUID():String{
			return UIDUtil.createUID();
		}

		
		
		/**
		 * 格式化日期的样式
		 */ 
		public static function dateToString(formatStr:String,value:Object):String {
			var dft:DateFormatter = new DateFormatter();
			dft.formatString = formatStr;
			return dft.format(value);
		}

		/**
		 * 格式化日期的样式
		 */ 
		public static function dateFormat(formatStr:String,value:Object):String {
			var dft:DateFormatter = new DateFormatter();
			dft.formatString = formatStr;
			return dft.format(value);
		}
		
		/**
		 * 获得RemoteObject对象
		 * 
		 */
		public static function remoteObject():RemoteObject {
			FlexClient.getInstance().id=null;
			var remote:RemoteObject = new RemoteObject();
			remote.endpoint = Constants.REMOTE_IP;
			return remote;
		}
		
		
		/**
		 * 格式化货币
		 */ 
		public static function numberToString(value:Object):String{
			var nf:NumberFormatter=new NumberFormatter();
			nf.useThousandsSeparator=false;
			nf.precision=2;
			nf.rounding="nearest";
			var s:String=nf.format(value);
			if(s=="")
				return "0.00";
			return nf.format(value);
		}
		
	
		/**
		 *对象转成xml字符串
		 * @root 根标签名称
		 * @item 如果有数组时，子元素的标签名称
		 */ 
		public static function objectToXML(obj:Object,root:String="root",item:String="item"):String{ 
			var qName:QName = new QName(root);
			var xmlDocument:XMLDocument = new XMLDocument(); 
			var encoder:MyXmlEncoder = new MyXmlEncoder(xmlDocument);
			encoder.item=item;
			var xmlNode:XMLNode = encoder.encodeValue(obj, qName, xmlDocument);
			var xml:XML = new XML(xmlDocument.toString());
			trace(xml.toXMLString()); 
			return xml.toXMLString(); 
		}
		public static function xmlToObject(xml:String):Object{
			var decoder:SimpleXMLDecoder=new SimpleXMLDecoder(true);
			return decoder.decodeXML(new XMLDocument(xml));
		}
		
		/**
		 * 得到这个月的最后一天的日期
		 * @param Date
		 * return value,eg: "2010-11-30 23:59:59"
		 **/
		public static function lastDay(date:Date):Date {
			if(date == null)
				return null;
			var lastDay:Date = nextMFDay(date);
			lastDay['seconds']+=-1;
			return lastDay;
			
		}
		
		
		public static function nextSecond(date:Date):Date {
			if(date == null)
				return null;
			var lastDay:Date = new Date(date.getFullYear(),date.getMonth(),date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds() + 1);
			return lastDay;
		}
		/**
		 * 得到这个月的第一天的日期
		 * @param Date
		 *  return value,eg: "2010-11-18 00:00:00"
		 **/
		public static function firstDay(date:Date):Date {
			if(date == null)
				return null;
			var beginDate:Date = new Date(date.getFullYear(),date.getMonth());
			return beginDate;
		}
		
		
		/**
		 * 得到date的零点日期
		 * @param Date
		 *  return value,eg: "2010-11-18 00:00:00"
		 **/
		public static function zeroDay(date:Date):Date {
			if(date == null)
				return null;
			var beginDate:Date = new Date(date.getFullYear(),date.getMonth(),date.getDate());
			return beginDate;
		}
		/**
		 * 得到date的下个月的第一天
		 * @param Date
		 *  return value,eg: "2010-11-01 00:00:00"
		 **/
		public static function nextMFDay(date:Date):Date {
			if(date == null)
				return null;
			var beginDate:Date = new Date(date.getFullYear(),date.getMonth()+1);
			return beginDate;
		}
		
		/**
		 * 得到后一天的日期
		 * @param Date
		 * return value,eg: "2010-11-18 00:00:00"
		 **/
		public static function nextDay(date:Date):Date {
			if(date == null)
				return null;
			var nextDay:Date = new Date(date.getFullYear(),date.getMonth(),date.getDate());
			nextDay['date']+=1;
			return nextDay;
		}
		/**
		 * 得到前一天的日期
		 * @param Date 
		 * return value,eg: "2010-11-18 00:00:00"
		 **/
		public static function prevDay(date:Date):Date {
			if(date == null)
				return null;
			var prevDay:Date = new Date(date.getFullYear(),date.getMonth(),date.getDate());
			prevDay['date']-=1;
			return prevDay;
		}
		/**
		 * 截取两位小数
		 **/
		public static function getDecimal2(number:Number):Number{
			return Math.round(number*100)/100;
		}
		/**
		 * 转换时间对象为Number
		 */ 
		public static function UTCToJulianDay(newDate:Date):Number{
			return (( newDate.time - (newDate.getTimezoneOffset()*60000))  / 86400000) + 2440587.5;
		}
		
		 
		/**
		 * 转换图片
		 */ 
		public static function imgToJpg(img:UIComponent):ByteArray{
			var bmp:Bitmap=ByteArrayToBitmap(BitmapDataToByteArray(img));
			var jpegEnc:JPEGEncoder=new JPEGEncoder(100);
			return jpegEnc.encode(bmp.bitmapData);
		}
		//将可视的UIComponent组件转换为ByteArray数组，我就是在UIComponent那里放了一个图片 
		private static function BitmapDataToByteArray(target : UIComponent):ByteArray{ 
			var imageWidth:uint = target.width; 
			var imageHeight:uint = target.height; 
			var srcBmp:BitmapData = new BitmapData( imageWidth, imageHeight ); 
			//将组件读取为BitmapData对象，bitmagData的数据源 
			srcBmp.draw( target ); 
			//getPixels方法用于读取指定像素区域生成一个ByteArray，Rectangle是一个区域框，就是起始坐标 
			var pixels:ByteArray = srcBmp.getPixels( new Rectangle(0,0,imageWidth,imageHeight) ); 
			//下面俩行将数据源的高和宽一起存储到数组中,为翻转的时候提供高度和宽度 
			pixels.writeShort(imageHeight); 
			pixels.writeShort(imageWidth); 
			return pixels; 
		}
		//次方法的参数必须是像上面的ByteArray形式一样的,即需要对象的大小; 
		//此方法返回的Bitmap可以直接赋值给Image的source属性 
		private static function ByteArrayToBitmap(byArr:ByteArray):Bitmap{ 
			if(byArr==null){ 
				return null; 
			} 
			//读取出存入时图片的高和宽,因为是最后存入的数据,所以需要到尾部读取 
			var bmd:ByteArray= byArr; 
			bmd.position=bmd.length-2; 
			var imageWidth:int = bmd.readShort(); 
			bmd.position=bmd.length-4; 
			var imageHeight:int= bmd.readShort(); 
			var copyBmp:BitmapData = new BitmapData( imageWidth, imageHeight, true ); 
			//利用setPixel方法给图片中的每一个像素赋值,做逆操作 
			//ByteArray数组从零开始存储一直到最后都是图片数据,因为读入时的高和宽都是一样的,所以当循环结束是正好读完 
			bmd.position = 0; 
			for( var i:uint=0; i<imageHeight ; i++ ) 
			{ 
				for( var j:uint=0; j<imageWidth; j++ ) 
				{ 
					copyBmp.setPixel( j, i, bmd.readUnsignedInt() ); 
				} 
			} 
			var bmp:Bitmap = new Bitmap( copyBmp ); 
			return bmp; 
		}
		/**
		 * 把base64编码字符串转化为byteArray
		 */
		public static function base64ToArray(logo:String):ByteArray{
			var byteArr:ByteArray;
			var base64Dec:Base64Decoder;
			base64Dec = new Base64Decoder();
			base64Dec.decode(logo);
			
			byteArr = base64Dec.toByteArray();
			
			return byteArr;
			
		}
		
	}
}